
from flask_restful import Resource
from flask import current_app,jsonify,make_response,request

from ihome.tasks.task_sms import send_sms
from ihome.utils.captcha.captcha import captcha
from ihome import redis_store,db
from ihome import constants
from ihome.libs.yuntongxun.send_information import CCP
from ihome.utils.response_code import RET,error_map
from ihome.models import User
from ihome.utils.commons import data_base_error
import random

class VerifyCode(Resource):
    method_decorators = [data_base_error]

    def get(self,image_code_id):
        '''
        获取图片验证码
        ：params image_code_id 图片验证码编号
        ：return 验证码
            '''
        # 1.获取参数
        # 2.检验参数
        # 3.业务逻辑处理
        # 生成验证码图片
        name,text,image_data = captcha.generate_captcha()
        # 将验证码真实值和编号保存到redis中 设置有效期

        # 4.返回值
        # redis 中数据类型: 字符串 列表 哈希 set 
        # key : value
        # 列表很鸡肋 hash维护的话有效期只能这只整体也不行

        # redis_store.set('image_code_{}'.format(image_code_id),text)
        # redis_store.expire('image_code_{}'.format(image_code_id), constants.IMAGE_CODE_REDIS_EXPIRE)
        redis_store.setex('image_code_{}'.format(image_code_id),constants.IMAGE_CODE_REDIS_EXPIRE,text)
        
        resp = make_response(image_data)
        resp.headers['Content-Type'] = 'image/jpg'
        return resp

class Get_sms_code(Resource):

    method_decorators = [data_base_error]

    def get(self,mobile):

        '''获取图片验证码'''
        image_code = request.args.get('image_code')
        image_code_id = request.args.get('image_code_id')

        # 校验参数 其实应该放在另一个py文件中
        if not all([image_code,image_code_id]):
            return jsonify(constants.return_template_json(RET.PARAMERR,error_map.get(RET.PARAMERR)))

        redis_image_code = redis_store.get('image_code_{}'.format(image_code_id))

        if redis_image_code is None:
            return jsonify(constants.return_template_json(RET.PARAMERR,error_map.get(RET.PARAMERR)))

        # 删除redis数据
        redis_store.delete('image_code_{}'.format(image_code_id))

        if redis_image_code.lower() != image_code.lower():
            return jsonify(constants.return_template_json(RET.PARAMERR,error_map.get(RET.PARAMERR)))

        # 判断手机是否发送过短信
        send_flag = redis_store.get('send_sms_code_{}'.format(mobile))
        if send_flag is not None:
            return jsonify(constants.return_template_json(RET.REQERR, error_map.get(RET.REQERR)))

        user = User.query.filter_by(mobile = mobile).first()

        if user is not None:
            return jsonify(constants.return_template_json(RET.DATAEXIST,error_map.get(RET.DATAEXIST)))

        sms_code = random.randint(100000, 999999)

        # 保存发送的短信 和手机号 防止手机60秒内再次发送
        redis_store.setex("sms_code_{}".format(mobile), constants.SMS_CODE_EXPIRE, sms_code)
        redis_store.setex('send_sms_code_{}'.format(mobile),constants.SMS_CODE_CODE_PHONE,mobile)


        # ccp = CCP()
        # result = ccp.send_template_sms(constants.SMS_CODE_TEMPLATE, mobile, (sms_code,constants.SMS_CODE_EXPIRE/60))
        # celery发送代替 delay后send_sms函数立即返回
        send_sms.delay(constants.SMS_CODE_TEMPLATE, mobile, (sms_code,constants.SMS_CODE_EXPIRE/60))

        current_app.logger.debug(sms_code)

        # if result == 0:
        #     return jsonify(constants.return_template_json(RET.OK,error_map.get(RET.OK)))
        # else:
        #     return jsonify(constants.return_template_json(RET.THIRDERR,error_map.get(RET.THIRDERR)))
        return jsonify(constants.return_template_json(RET.OK,error_map.get(RET.OK)))